package com.tom.architect.day01.simple5;

import android.content.Context;

import com.tom.architect.day01.simple5.framework.HttpCallBack;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author Tom
 * @Date 2023/12/05.
 * 链式调用：更多的是关注业务逻辑，
 * 链式调用：解决n个参数调用，弄好多个方法的问题(1个参数的方法，...n个参数的方法)。
 */
public class HttpUtils {

    private IHttpRequest mHttpRequest;
    private static IHttpRequest mInitHttpRequest; // 静态全局request
    private final int TYPE_POST = 0x0011, TYPE_GET = 0x0022;
    private int mType = TYPE_GET; // 请求方式，默认get
    private Map<String, Object> mParams; // 请求参数
    private String mUrl;
    private Context mContext;

    // 传递Context
    public static HttpUtils with(Context context) {
        return new HttpUtils(context);
    }

    private HttpUtils(Context context) {
        mHttpRequest = new OkHttpRequest();
        mParams = new HashMap<>();
        this.mContext = context;
    }

    // Application初始化时，全局设置request
    // 换网络框架，只要改一处即可。
    public static void initHttpRequest(IHttpRequest httpRequest) {
        mInitHttpRequest = httpRequest;
    }

    // 解析类上面的class信息
    public static Class<?> analysisClazzInfo(Object object) {
        Type genType = object.getClass().getGenericSuperclass();
        Type[] params = ((ParameterizedType)genType).getActualTypeArguments();
        return (Class<?>) params[0];
    }

    // 调用处，手动指定request，满足特定的需求。临时替换网络框架方案。
    // 比如，下载可以单独使用xUtils框架；其他地方使用OkHttp框架。单独使用某个网络框架。exchangeEngine
    public HttpUtils httpRequest(IHttpRequest httpRequest) {
        mHttpRequest = httpRequest;
        return this;
    }


    // 设置是get请求
    public HttpUtils get() {
        mType = TYPE_GET;
        return this;
    }

    public HttpUtils post() {
        mType = TYPE_POST;
        return this;
    }

    // 参数传递
    public HttpUtils param(String key, Object value) {
        mParams.put(key, value);
        return this;
    }

    public HttpUtils addParams(Map<String, Object> params) {
        mParams.putAll(params);
        return this;
    }
    // 添加请求头，header

    // 设置url
    public HttpUtils url(String url) {
        this.mUrl = url;
        return this;
    }

    public HttpUtils cache(boolean cache) {
        // TODO 缓存
        return this;
    }

    // 不带callback的请求
    public <T> void request() {
        request(null);
    }

    // 执行get请求。
    public <T> void request(final HttpCallBack<T> callback) {
        // 添加公共请求参数。但是baseLib不包含业务逻辑。让callback回调去
        callback.onPreExecute(mContext, mParams);


        if (callback == null) {
//            callback = EngineCallBack.DEFAULT_CALLBACK;
        }

        if (mHttpRequest == null) {
            // 异常判断：未设置，使用全局设置的request.
            mHttpRequest = mInitHttpRequest;
        }
        if (mContext == null) {
            // TODO
        }
        if (mUrl == null) {
            // TODO
        }
        // 判断执行方法 get/post
        if (mType == TYPE_GET) {
            mHttpRequest.get(mContext, mUrl, mParams, callback, true);
        }
        if (mType == TYPE_POST) {
            mHttpRequest.post(mContext, mUrl, mParams, callback, true);
        }
    }

    /*public  <T> void get(Context context, String url, Map<String, Object> params, final HttpCallBack<T> callback, final boolean cache) {
        mHttpRequest.get(context,url,params,callback,cache);
    }
    // 10几个参数以上
    public  <T> void get(Context context, String url, Map<String, Object> params,
                         final HttpCallBack<T> callback, final boolean cache,final boolean cookie,int recount) {
        mHttpRequest.get(context,url,params,callback,cache);
    }*/

    public void cancelRequest(Object tag) {
//        mHttpEngine.cancelRequest(tag);
    }
}
